using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using ADL;
using ADL.ActivosTableAdapters;
using AEL.ACT;
using BEL;

namespace CEL.ACT
{
    /// <summary>
    /// Acceso a la base de datos
    /// Modulo:Activos ta
    /// Tabla:Act_Ubicacion_Personal
    /// </summary>
    public class DO_Act_Ubicacion_Personal
    {
        #region Adapter

        private Act_Ubicacion_PersonalTableAdapter _Adapter;

        /// <summary>
        /// Acceso al Table Adapter de la capa ADL
        /// </summary>
        public Act_Ubicacion_PersonalTableAdapter Adapter
        {
            get
            {
                if (_Adapter == null)
                    _Adapter = new Act_Ubicacion_PersonalTableAdapter();
                return _Adapter;
            }
        }

        #endregion

        #region Obtención de datos

        //Obtencion de datos
        /// <summary>
        /// Obtiene todos los datos de la tabla Act_Ubicacion_Personal
        /// </summary> 
        /// <returns>Lista de objetos Act_Ubicacion_Personal</returns> 
        public List<Act_Ubicacion_Personal> Get(Scope s)
        {
            string llamada = "";
            List<Act_Ubicacion_Personal> lista = new List<Act_Ubicacion_Personal>();
            //Extrae los datos
            if (s != null)
            {
                Activos.Act_Ubicacion_PersonalDataTable tabla =
                    Adapter.Get(s.Ver_Version_Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: Get " + "Parametros  Enviados en el Método: s " +
                          " Nombre del Store Procedure: " + " Act_Ubicacion_Personal_Get " + " Número de Registros: " +
                          numeroRegistros;
                //Carga en la lista
                foreach (Activos.Act_Ubicacion_PersonalRow fila in tabla)
                    lista.Add(new Act_Ubicacion_Personal(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Act_Ubicacion_Id,
                                  fila.Per_Personal_Id,
                                  fila.Descripcion,
                                  fila.Act_Ubicacion_Codigo,
                                  fila.Act_Ubicacion_Nombre,
                                  fila.Per_Personal_Codigo,
                                  fila.Per_Personal_Nombre,
                                  fila.Estado_Nombre));
            }
            //Devuleve la Lista
            return lista;
        }

        public List<Act_Ubicacion_Personal> GetByCodigo(Scope s, string Codigo)
        {
            string llamada = "";
            List<Act_Ubicacion_Personal> lista = new List<Act_Ubicacion_Personal>();
            //Extrae los datos
            if (s != null)
            {
                Activos.Act_Ubicacion_PersonalDataTable tabla =
                    Adapter.GetByCodigo(s.Ver_Version_Id, Codigo);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetByCodigo" + " Parametros  Enviados en el Método: " +
                          "," + " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Codigo : " + Codigo +
                          " Nombre del Store Procedure: " + "dbo.Act_Ubicacion_Personal_ByCodigo " +
                          " Número de Registros: " + numeroRegistros;
                //Carga en la lista
                foreach (Activos.Act_Ubicacion_PersonalRow fila in tabla)
                    lista.Add(new Act_Ubicacion_Personal(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Act_Ubicacion_Id,
                                  fila.Per_Personal_Id,
                                  fila.Descripcion,
                                  fila.Act_Ubicacion_Codigo,
                                  fila.Act_Ubicacion_Nombre,
                                  fila.Per_Personal_Codigo,
                                  fila.Per_Personal_Nombre,
                                  fila.Estado_Nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }

        public List<Act_Ubicacion_Personal> GetById(Scope s, string Id)
        {
            string llamada = "";
            List<Act_Ubicacion_Personal> lista = new List<Act_Ubicacion_Personal>();
            //Extrae los datos
            if (s != null)
            {
                Activos.Act_Ubicacion_PersonalDataTable tabla =
                    Adapter.GetById(s.Ver_Version_Id, Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetById" + " Parametros  Enviados en el Método: " + "," +
                          " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Id : " + Id +
                          " Nombre del Store Procedure: " + "dbo.Act_Ubicacion_Personal_ById " +
                          " Número de Registros: " + numeroRegistros;
                //Carga en la lista
                foreach (Activos.Act_Ubicacion_PersonalRow fila in tabla)
                    lista.Add(new Act_Ubicacion_Personal(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Act_Ubicacion_Id,
                                  fila.Per_Personal_Id,
                                  fila.Descripcion,
                                  fila.Act_Ubicacion_Codigo,
                                  fila.Act_Ubicacion_Nombre,
                                  fila.Per_Personal_Codigo,
                                  fila.Per_Personal_Nombre,
                                  fila.Estado_Nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }
        
        public List<Act_Ubicacion_Personal> GetByUbicacion(Scope s, string Act_Ubicacion_Id)
        {
            string llamada = "";
            List<Act_Ubicacion_Personal> lista = new List<Act_Ubicacion_Personal>();
            //Extrae los datos
            if (s != null)
            {
                Activos.Act_Ubicacion_PersonalDataTable tabla =
                    Adapter.GetByUbicacion(s.Ver_Version_Id, Act_Ubicacion_Id);
                //Cuenta  el número  de registros de la tabla
                int numeroRegistros = tabla.Count;
                llamada = "Nombre del Método Utilizado: " + " GetByUbicacion" + " Parametros  Enviados en el Método: " +
                          "," + " s.Ver_Version_Id : " + s.Ver_Version_Id + "," + " Act_Ubicacion_Id : " +
                          Act_Ubicacion_Id + " Nombre del Store Procedure: " + "dbo.Act_Ubicacion_Personal_ByUbicacion " +
                          " Número de Registros: " + numeroRegistros;
                //Carga en la lista
                foreach (Activos.Act_Ubicacion_PersonalRow fila in tabla)
                    lista.Add(new Act_Ubicacion_Personal(
                                  fila.Id,
                                  fila.Codigo,
                                  fila.Estado,
                                  fila.Act_Ubicacion_Id,
                                  fila.Per_Personal_Id,
                                  fila.Descripcion,
                                  fila.Act_Ubicacion_Codigo,
                                  fila.Act_Ubicacion_Nombre,
                                  fila.Per_Personal_Codigo,
                                  fila.Per_Personal_Nombre,
                                  fila.Estado_Nombre));
            }
            //Realiza la auditoria
            Auditar.Registro(s, llamada, lista, Textos._AUDITAR_ACCION_SELECT_SEL);
            //Devuleve la Lista
            return lista;
        }

        #endregion

        #region Operaciones con datos

        //Inserta
        /// <summary>
        /// Inserta el objeto en la tabla Act_Ubicacion_Personal
        /// </summary>
        /// <param name="s">Variables de ámbito como la versión y la sucursal</param>
        // <returns></returns>
        public string Insert(Scope s, Act_Ubicacion_Personal o)
        {
            // Genera un nuevo Id, codigo y estado.
            o.GenNewId(s.Int_Sucursal_Numero);
            o.GenCodigo(s.Ver_Version_Id);
            o.GenEstado();
            // Controla el error de clave primaria duplicada.
            try
            {
                Adapter.Insert(
                    o.Id,
                    o.Codigo,
                    o.Act_Ubicacion_Id,
                    o.Per_Personal_Id,
                    o.Estado,
                    o.Descripcion
                    );
            }
            catch (SqlException e)
            {
                Exception eCaso;
                Exception otroEX;
                switch (e.Number)
                {
                        // Si el error es de violación PK, entonces repite.
                    case 2627:
                        string mensaje = e.Errors[0].Message;
                        if (mensaje.StartsWith(Textos._ERR_VIOLATION_UNIQUE_KEY))
                            return Insert(s, o);
                        else
                        {
                            if (e.Message.Contains(TXT_BDD._IX_Act_Ubicacion_Personal_Codigo))
                            {
                                eCaso = new Exception("");
                                otroEX = new Exception(TXT_Mensajes._MSJ32, eCaso);
                                throw (otroEX);
                            }
                            if (e.Message.Contains(TXT_BDD._IX_Act_Ubicacion_Personal_Ubicacion_Personal))
                            {
                                eCaso = new Exception("");
                                otroEX = new Exception(TXT_Mensajes._MSJ36, eCaso);
                                throw (otroEX);
                            }
                            eCaso = new Exception(e.Message);
                            otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                            throw (otroEX);
                        }
                        break;
                    default:
                        eCaso = new Exception(e.Message);
                        otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                        throw (otroEX);
                }
            }
            //Control de Auditoria
            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_INSERT);
            //Retorna el Id Insetado
            return o.Id;
        }

        // Borra
        /// <summary>
        /// Borra el objeto de la tabla Act_Ubicacion_Personal
        ///</summary>
        /// <param name="o">Objeto a actualizar</param>
        /// <returns></returns>
        public int Delete(Scope s, Act_Ubicacion_Personal o)
        {
            int resultado = 0;
            try
            {
                resultado = Adapter.Delete(
                    o.Id,
                    o.Codigo,
                    o.Act_Ubicacion_Id,
                    o.Per_Personal_Id,
                    o.Estado,
                    o.Descripcion
                    );
            }
            catch (SqlException e)
            {
                Exception eCaso;
                Exception otroEX;
                if (e.Message.Contains(TXT_BDD._FK_Act_Ubicacion_Personal_Act_Ubicacion))
                {
                    eCaso = new Exception("Act Ubicacion Personal");
                    otroEX = new Exception(TXT_Mensajes._MSJ26, eCaso);
                    throw (otroEX);
                }

                eCaso = new Exception(e.Message);
                otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                throw (otroEX);
            }

            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_DELETE);
            return resultado;
        } //Actualiza
        /// <summary>
        //Actualiza la tabla Act_Ubicacion_Personal
        /// </summary>
        /// <param name="o">Objeto que contiene la información a actualizar</param>
        /// <param name="original">Original para concurrencia optimista</param> 
        /// <returns></returns>
        public int Update(Scope s, Act_Ubicacion_Personal o, Act_Ubicacion_Personal original)
        {
            int resultado = 0;
            try
            {
                resultado = Adapter.Update(
                    o.Id,
                    o.Codigo,
                    o.Act_Ubicacion_Id,
                    o.Per_Personal_Id,
                    o.Estado,
                    o.Descripcion,
                    original.Id,
                    original.Codigo,
                    original.Act_Ubicacion_Id,
                    original.Per_Personal_Id,
                    original.Estado,
                    original.Descripcion
                    );
            }
            catch (SqlException e)
            {
                System.Exception eCaso;
                System.Exception otroEX;
                if (e.Message.Contains(TXT_BDD._IX_Act_Ubicacion_Personal_Codigo))
                {
                    eCaso = new Exception("");
                    otroEX = new Exception(TXT_Mensajes._MSJ32, eCaso);
                    throw (otroEX);
                }
                if (e.Message.Contains(TXT_BDD._IX_Act_Ubicacion_Personal_Ubicacion_Personal))
                {
                    eCaso = new Exception("");
                    otroEX = new Exception(TXT_Mensajes._MSJ36, eCaso);
                    throw (otroEX);
                }
                eCaso = new Exception(e.Message);
                otroEX = new Exception(TXT_Mensajes._MSJ34, eCaso);
                throw (otroEX);

            }

            Auditar.Registro(s, o, Textos._AUDITAR_ACCION_UPDATE);
            return resultado;
        }

        #endregion
    }
}